package ai.masks;

import ai.Threat;
import model.Slot;

public abstract class Mask {
	
	public Mask() {
		super();
	}

	/**
	 * Verifica se la maschera ?? applicabile in una data posizione 
	 * fornita la dimensione della board
	 * @param row indice di riga su cui applicare la maschera
	 * @param col indice di colonna su cui applicare la maschera
	 * @param boardRows indice della riga massima
	 * @param boardCols indice della colonna massima
	 * @return
	 */
	protected boolean isMaskApplicable(int row, int col, int boardRows, int boardCols)
	{
		if(row<=maxRow(boardRows, boardCols) && row>=minRow(boardRows, boardCols) && col<=maxCol(boardRows, boardCols) && col>=minCol(boardRows, boardCols))
			return true;
		else
			return false;
	}
	
	protected boolean isThreatPlayable(Slot[][] board, int row, int col)
	{
		boolean isPlayable = true;
		if(row<board.length-1 && board[row+1][col]==Slot.FREE)
			isPlayable = false;
		
		return isPlayable;
	}
	
	protected abstract int minRow(int boardRows, int boardCols);
	protected abstract int maxRow(int boardRows, int boardCols);
	protected abstract int minCol(int boardRows, int boardCols);
	protected abstract int maxCol(int boardRows, int boardCols);

	/**
	 * Applica la maschera restituendo la posizione dell'eventuale minaccia.
	 * Il punto di applicazione specificato da row e col non deve essere FREE
	 * @param board
	 * @param row
	 * @param col
	 * @return
	 */
	public abstract Threat applyMask(Slot[][] board, int row, int col);
}
